import 'dart:typed_data';
import 'package:pigeon/pigeon.dart';

@ConfigurePigeon(PigeonOptions(
  dartOut: 'lib/pigeon/generated.g.dart',
  dartOptions: DartOptions(),
  kotlinOut:
      'android/app/src/main/kotlin/com/cuhk/fedcampus/pigeon/generated.g.kt',
  kotlinOptions: KotlinOptions(),
  swiftOut: 'ios/Classes/pigeon/generated.g.swift',
  swiftOptions: SwiftOptions(),
  dartPackageName: 'fedcampus',
))

/// 闹钟管理 API
@HostApi()
abstract class AlarmApi {
  /// 设置闹钟
  @async
  Future<bool> setAlarm();
}

/// 基础数据模型
class Data {
  Data({
    required this.value,
    required this.name,
    required this.startTime,
    required this.endTime,
  });
  
  /// 数据名称
  String name;
  
  /// 数据值
  double value;
  
  /// 开始时间戳(毫秒)
  int startTime;
  
  /// 结束时间戳(毫秒)
  int endTime;
}

/// 数据获取 API
@HostApi()
abstract class DataApi {
  /// 根据名称和时间范围获取数据
  @async
  Future<List<Data>> getData(String name, int startTime, int endTime);
}

/// 华为认证 API
@HostApi()
abstract class HuaweiAuthApi {
  /// 获取认证状态
  @async
  Future<bool> getAuthenticate();
  
  /// 取消认证
  @async
  Future<bool> cancelAuthenticate();
}

/// 数据加载 API
@HostApi()
abstract class LoadDataApi {
  /// 根据数据列表和时间范围加载数据
  @async
  Future<Map<String, dynamic>> loaddata(
    List<Data> dataList, 
    int startTime, 
    int endTime
  );
}

/// 损失和准确率数据模型
class LossAccuracy {
  LossAccuracy(this.loss, this.accuracy);
  
  /// 损失值
  double loss;
  
  /// 准确率
  double accuracy;
}

/// FedMCRNN 训练 API
@HostApi()
abstract class TrainFedmcrnn {
  /// 初始化模型
  @async
  Future<void> initialize(String modelDir, List<int> layersSizes);
  
  /// 加载训练数据
  @async
  Future<void> loadData(Map<List<List<double>>, List<double>> data);
  
  /// 获取模型参数
  @async
  Future<List<Uint8List>> getParameters();
  
  /// 更新模型参数
  @async
  Future<void> updateParameters(List<Uint8List> parameters);
  
  /// 检查模型是否准备好
  bool ready();
  
  /// 训练模型
  @async
  Future<void> fit(int epochs, int batchSize);
  
  /// 获取训练数据大小
  int trainingSize();
  
  /// 获取测试数据大小
  int testSize();
  
  /// 评估模型
  @async
  Future<LossAccuracy> evaluate();
}

/// 应用使用统计 API
@HostApi()
abstract class AppUsageStats {
  /// 获取应用使用数据
  @async
  Future<List<Data>> getData(String name, int startTime, int endTime);
  
  /// 获取使用统计权限
  @async
  Future<void> getAuthenticate();
}    